/* dyn_arr.c -- dynamically allocated array */
/* dyn_arr.c -- 动态分配数组 */

#include <stdio.h>
#include <stdlib.h> /* 为 malloc()、free()提供原型 */
int main(void)
{
    double * ptd;
    int max = 0;
    int number;
    int i = 0;
    puts("What is the maximum number of type double entries?");

    if (scanf("%d", &max) != 1)
    {
        puts("Number not correctly entered -- bye.");
        exit(EXIT_FAILURE);
    }
    ptd = (double *) malloc(max * sizeof (double));
    /* 如果程序成功分配内存，便可把ptd视为一个有max个元素的数组名
     */

    if (ptd == NULL)
        /* malloc()可能分配不到所需的内存。
         * 在这种情况下，该函数返回空指针，程序结束
         * */
    {
        puts("Memory allocation failed. Goodbye.");
        exit(EXIT_FAILURE);
    }

    /* ptd now points to an array of max elements */
    /* ptd 现在指向有max个元素的数组 */

    puts("Enter the values (q to quit):");

    while (i < max && scanf("%lf", &ptd[i]) == 1){
        ++i;
    }

    printf("Here are your %d entries:\n", number = i);

    for (i = 0; i < number; i++)
    {
        printf("%7.2f ", ptd[i]);
        if (i % 7 == 6)
            putchar('\n');
    }

    if (i % 7 != 0)
        putchar('\n');

    puts("Done.");

    free(ptd);
    /* free()函数位于程序的末尾，它释放了malloc()函数分配的内存。
     * */
    /* ，也许在循环结束之前就已耗尽所有的内存。
     * 这类问题被称为内存泄漏（memory leak）。
     * 在函数末尾处调用free()函数可避免这类问题发生。
     */
    return 0;
}
//
// Created by ChaoDONG on 2021-03-24.
//

